package com.it.product.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.spzx.product.api.domain.*;
import com.it.product.domain.ProductSpec;
import com.spzx.product.api.domain.vo.SkuPrice;
import com.spzx.product.api.domain.vo.SkuQuery;
import com.spzx.product.api.domain.vo.SkuStockVo;

import java.util.List;
import java.util.Map;

public interface IProductService extends IService<Product> {

    /**
     * 分页查询商品管理
     * @param product
     * @return
     */
    List<Product> selectPage(Product product);

    /**
     * 加载商品数据
     * @param id 分类的id
     * @return 品牌的名字
     */
    List<Brand> GetBrandNameById(Long id);

    /**3.
     * 根据分类id查询商品规格的名字
     * @param categoryId
     * @return
     */
    List<ProductSpec>  selectSpecNameById(Long categoryId);

    /**
     * 新增商品
     * @param product 四张表的数据
     * @return
     */
    int saveList(Product product);

    /**
     * 根据商品的id 查询商品的信息
     * @param id 商品的id
     * @return
     */
    Product selectByproductId(Long id);

    /**
     * 修改商品
     * @param product
     * @return
     */
    int updateProduct(Product product);

    /**
     * 根据商品id删除商品
     * @param ids 商品id
     * @return
     */
    int removeProductByIds(List<Long> ids);

    /**
     * 根据商品的id修改商品的状态
     * @param id 商品的id
     * @param auditStatus 商品的状态
     * @return
     */
    int updateAuditStatus(Long id, Integer auditStatus);

    /**
     * 更新商品的上下架状态
     * @param id 商品的id
     * @param status 商品的状态 1 上架 -1下架
     * @return
     */
    int updateStatus(Long id, Integer status);


    /**
     * 查询销量前20的商品的信息
     * @return 返回的是以productSku为主表
     */
    List<ProductSku> getTopSale();

    /**
     * 分页条件查询商品信息
     * @param skuQuery 查询对象
     * @return 返回多个对象
     */
    List<ProductSku> skuList(SkuQuery skuQuery);

    /**
     * 查询sku信息
     * @param skuId id
     * @return
     */
    ProductSku getProductSku(Long skuId);

    /**
     * 查询product信息
     * @param id 主键id
     * @return
     */
    Product getProduct(Long id);

    /**
     * 查询价格从sku表查询
     * @param skuId 主键id
     * @return
     */
    SkuPrice getSkuPrice(Long skuId);

    /**
     * 查询ProductDetails表信息
     * @param id p的主键
     * @return
     */
    ProductDetails getProductDetails(Long id);

    /**
     * 查新sku_stock表的信息
     * @param skuId 主键skuId
     * @return
     */
    SkuStockVo getSkuStock(Long skuId);

    /**
     * 查询sku表的信息 根据p的id 多个 key为sku_spc 值为skuId
     * @param id p的主键id
     * @return
     */
    Map<String, Long> getSkuSpecValue(Long id);

    /**
     * 批量查询商品价格
     * @param skuIdList 商品id
     * @return
     */
    List<SkuPrice> getSkuPriceList(List<Long> skuIdList);

    /**
     * 检查库存是否够 并且锁定库存
     * @param orderNo 订单号
     * @param skuLockVoList  订单信息集合表
     * @return
     */
    String checkAndLock(String orderNo, List<SkuLockVo> skuLockVoList);

    /**
     * 解锁
     * @param orderNo
     */
    void unlock(String orderNo);

    /**
     * 减库存
     * @param orderNo
     */
    void minus(String orderNo);
}
